/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.gob.pnp.despachadores;

import java.sql.*;
import java.util.*;
import oracle.jdbc.*;
import pe.gob.pnp.actions.*;
import pe.gob.pnp.factories.*;

/**
 *
 * @author Freddy SInarahua Apuela
 */
public class UsuarioDespachador {

    public static boolean loguearUsuario(Usuario usuario) throws SQLException {
        Connection conn = null;
        boolean logueado = false;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = " SELECT COUNT(*) AS NRO  FROM SEGMA_USUARIO";
            sql += " WHERE UPPER(CUSUA_USERNAME)=? AND UPPER(CUSUA_CLAVE)=TOOLKIT.ENCRYPT(?)";
            sql += " AND BUSUA_ACTIVO=1";
            PreparedStatement cs = conn.prepareStatement(sql);
            cs.setString(1, usuario.getCusuaUsername().toUpperCase());
            cs.setString(2, usuario.getCusuaClave().toUpperCase());
            ResultSet rs = cs.executeQuery();
            int nro=0;
            if (rs.next()){
                nro=rs.getInt("NRO");
            }
            logueado = nro == 1;
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return logueado;
    }

    public static void obtenerDatosUsuario(Usuario usuario) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_DATOS_USUARIO(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setString(1, usuario.getCusuaUsername().toUpperCase());
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            if (rs.next()) {
                usuario.setNusuaIdentificador(rs.getInt("NUSUA_IDENTIFICADOR"));
                usuario.setStrNombreCompleto(rs.getString("NOMBRECOMPLETO"));
                usuario.setCusuaUsername(rs.getString("CUSUA_USERNAME"));
                usuario.setNpepoIdentificador(rs.getInt("NPEPO_IDENTIFICADOR"));
                Dependencia dependencia = new Dependencia();
                dependencia.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                dependencia.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                dependencia.setCdepeSiglas(rs.getString("CDEPE_SIGLAS"));

                usuario.setDependencia(dependencia);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void obtenerDatosUsuarioID(Usuario usuario) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_DATOS_USUARIO_ID(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, usuario.getNusuaIdentificador());
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            if (rs.next()) {
                usuario.setNusuaIdentificador(rs.getInt("NUSUA_IDENTIFICADOR"));
                usuario.setStrNombreCompleto(rs.getString("NOMBRECOMPLETO"));
                usuario.setCusuaUsername(rs.getString("CUSUA_USERNAME"));
                usuario.setCusuaClave(rs.getString("CUSUA_CLAVE"));
                usuario.setBusuaActivo(rs.getBoolean("BUSUA_ACTIVO"));
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }
    public static List<UsuarioBean> buscarUsuarioApenom(String apenom)throws SQLException{
       List<UsuarioBean> lstUsuarios = new ArrayList<UsuarioBean>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "SELECT ROWNUM,U.NUSUA_IDENTIFICADOR,U.CUSUA_USERNAME,U.BUSUA_ACTIVO,";
            sql += " U.NPEPO_IDENTIFICADOR,P.CPERS_APEPATERNO,P.CPERS_APEMATERNO,";
            sql += " P.CPERS_NOMBRE,PP.NDEPE_IDENTIFICADOR,";
            sql += " D.CDEPE_NOMBRE,D.CDEPE_SIGLAS";
            sql += " FROM DIRPEN.SEGMA_USUARIO U";
            sql += " INNER JOIN DIRPEN.PERMA_PERSONALPOLICIAL PP";
            sql += " ON PP.NPEPO_IDENTIFICADOR = U.NPEPO_IDENTIFICADOR";
            sql += " INNER JOIN DIRPEN.PERMA_PERSONA P";
            sql += " ON P.NPERS_IDENTIFICADOR=PP.NPERS_IDENTIFICADOR";
            sql += " INNER JOIN DIRPEN.GENMA_DEPENDENCIA D";
            sql += " ON D.NDEPE_IDENTIFICADOR = PP.NDEPE_IDENTIFICADOR";
            sql += " WHERE BUSUA_ELIMINADO = 0";
            sql += " AND P.CPERS_APEPATERNO||' '||P.CPERS_APEMATERNO||', '||P.CPERS_NOMBRE LIKE ?";
            sql += " ORDER BY ROWNUM";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, "%"+apenom+"%");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                UsuarioBean usuario = new UsuarioBean();
                usuario.setFila(rs.getInt("ROWNUM"));
                usuario.setNusua_identificador(rs.getInt("NUSUA_IDENTIFICADOR"));
                usuario.setCusua_username(rs.getString("CUSUA_USERNAME"));
                usuario.setBusua_activo(rs.getBoolean("BUSUA_ACTIVO"));
                usuario.setNpepo_identificador(rs.getInt("NPEPO_IDENTIFICADOR"));
                usuario.setCpers_apepaterno(rs.getString("CPERS_APEPATERNO"));
                usuario.setCpers_apematerno(rs.getString("CPERS_APEMATERNO"));
                usuario.setCpers_nombre(rs.getString("CPERS_NOMBRE"));
                usuario.setNdepe_identificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                usuario.setCdepe_nombre(rs.getString("CDEPE_NOMBRE"));
                usuario.setCdepe_siglas(rs.getString("CDEPE_SIGLAS"));
                lstUsuarios.add(usuario);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstUsuarios;
    }
    public static List<Usuario> obtenerUsuarios() throws SQLException {
        List<Usuario> lstUsuarios = new ArrayList<Usuario>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_USUARIOS(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                Usuario usuario = new Usuario();
                usuario.setCusuaUsername(rs.getString("CUSUA_USERNAME"));
                usuario.setStrNombreCompleto(rs.getString("NOMBRECOMPLETO"));
                usuario.setNusuaIdentificador(rs.getInt("NUSUA_IDENTIFICADOR"));
                usuario.setCusuaClave(rs.getString("CUSUA_CLAVE"));
                usuario.setBusuaActivo(rs.getBoolean("BUSUA_ACTIVO"));
                usuario.setNperfIdentificador(rs.getInt("NPEUS_IDENTIFICADOR"));
                usuario.setCperfNombre(rs.getString("CPERF_NOMBRE"));
                usuario.setNgradDescripcion(rs.getString("CGRAD_DESCRIPCION"));
                lstUsuarios.add(usuario);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstUsuarios;
    }

    public static List<PersonalPolicial> obtenerPersonalPolicial() throws SQLException {
        List<PersonalPolicial> lstPersonalPolicial = new ArrayList<PersonalPolicial>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_PERPOL_SIN_USUARIO(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                PersonalPolicial perpol = new PersonalPolicial();
                perpol.setNpepoIdentificador(rs.getInt("NPEPO_IDENTIFICADOR"));
                perpol.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                perpol.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                perpol.setNpersIdentificador(rs.getInt("NPERS_IDENTIFICADOR"));
                lstPersonalPolicial.add(perpol);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstPersonalPolicial;
    }

    public static boolean agregarUsuario(int nperf_identificador,String cuser_username,String cuser_clave,int npers_identificador,int ndepe_identificador) throws SQLException {
        Connection conn = null;
        boolean flag = false;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_AGREGAR_USUARIOPERFIL(?,?,?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setString(1, cuser_username);
            cs.setString(2, cuser_clave);
            cs.setInt(3, npers_identificador);
            cs.setInt(4, nperf_identificador);
            cs.setInt(5, ndepe_identificador);
            cs.execute();
            flag=true;
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return flag;
    }
    public static void modificarPerfilUsuario(Usuario usuario) throws SQLException{
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_MODIFICAR_PERFILUSUARIO(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, usuario.getNperfIdentificador());
            cs.setInt(2, usuario.getNusuaIdentificador());
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }
    public static void modificarUsuario(Usuario usuario) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_MODIFICAR_USUARIO(?,?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, usuario.getNusuaIdentificador());
            cs.setString(2, usuario.getCusuaUsername());
            cs.setString(3, usuario.getCusuaClave());
            cs.setInt(4, usuario.isBusuaActivo() ? 1 : 0);
            cs.execute();
            modificarPerfilUsuario(usuario);
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void eliminarUsuario(int nusuaidentificador) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_ELIMINAR_USUARIO(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, nusuaidentificador);
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }


    public static List<PersonalPolicial> obtenerPersonalPolicialSinUsuario() throws SQLException {
        List<PersonalPolicial> lstPersonalPolicial = new ArrayList<PersonalPolicial>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_PERPOL_SIN_USUARIO(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                PersonalPolicial perpol = new PersonalPolicial();
                perpol.setNpepoIdentificador(rs.getInt("NPEPO_IDENTIFICADOR"));
                perpol.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                perpol.setCpersApepaterno(rs.getString("CPERS_APEPATERNO"));
                perpol.setCpersApematerno(rs.getString("CPERS_APEMATERNO"));
                perpol.setCpersNombre(rs.getString("CPERS_NOMBRE"));
                perpol.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                perpol.setNpersIdentificador(rs.getInt("NPERS_IDENTIFICADOR"));
                lstPersonalPolicial.add(perpol);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstPersonalPolicial;
    }

    public static List<PersonalPolicial> obtenerPerPol() throws SQLException {
        List<PersonalPolicial> lstPersonalPolicial = new ArrayList<PersonalPolicial>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_PERSONAL_POLICIAL(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                PersonalPolicial perpol = new PersonalPolicial();
                perpol.setNpepoIdentificador(rs.getInt("NPEPO_IDENTIFICADOR"));
                perpol.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                perpol.setCpersApepaterno(rs.getString("CPERS_APEPATERNO"));
                perpol.setCpersApepaterno(rs.getString("CPERS_APEMATERNO"));
                perpol.setCpersNombre(rs.getString("CPERS_NOMBRE"));
                perpol.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                perpol.setNpersIdentificador(rs.getInt("NPERS_IDENTIFICADOR"));
                lstPersonalPolicial.add(perpol);
            
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstPersonalPolicial;
    }

    public static void actualizarContrasenia(String nusua_identificador, String nusua_clave) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "UPDATE SEGMA_USUARIO SET CUSUA_CLAVE= TOOLKIT.ENCRYPT(?)";
            sql += " WHERE  NUSUA_IDENTIFICADOR=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1,nusua_clave.toUpperCase());
            ps.setInt(2, Integer.parseInt(nusua_identificador));
            ps.executeUpdate();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

}
